class CompetenciaCargo < ActiveRecord::Base
  belongs_to :competencia
  belongs_to :cargo
  has_many :descripciones, :dependent => :destroy


  after_update :save_descripciones

  attr_writer :competencia_nombre, :cargo_nombre
  delegate :nombre, :to => :competencia, :prefix => true, :allow_nil => true
  delegate :nombre, :to => :cargo, :prefix => true, :allow_nil => true

  validate :presence_of_descripciones

  def cargo_nombre
    self.cargo.try(:nombre)
  end

  def self.ids_competencias(cargo_id)
    self.find_all_by_cargo_id(cargo_id).map(&:competencia_id)
  end
  
  def competencia_nombre
    self.competencia.try(:titulo)
  end

  def new_descripcion_attributes=(descripcion_attributes)
    descripcion_attributes.each do |attributes|
      descripciones.build(attributes) unless attributes.values.any?(&:blank?)
    end
  end

  def existing_descripcion_attributes=(descripcion_attributes)
    descripciones.reject(&:new_record?).each do |descripcion|
      attributes = descripcion_attributes[descripcion.id.to_s]
      if attributes
        descripcion.attributes = attributes
      else
        descripciones.destroy(descripcion)
      end
    end
  end


  def save_descripciones
    descripciones.each do |descripcion|
      descripcion.save!
    end
  end

  private

  def presence_of_descripciones
    if self.descripciones.empty?
      errors.add(:base, 'Debe llenar todos los campos') if self.competencia.try(:tipo) == 'especifica'
    end
  end

end

